from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter,URLRouter
import Chat.routing
import PrivateChat.routing

# scope 会包含哪些有用信息
# 在 Consumer 中你可以看到 self.scope（或 scope）包含很多字段，常用的有：
# scope["type"]：连接类型（"websocket"）
# scope["path"]：请求路径
# scope["query_string"]：原始 query string（bytes）
# scope["headers"]：原始 headers（list）
# scope["user"]：经 AuthMiddlewareStack 填充的 Django 用户对象
# scope["session"]：Django session（如果中间件启用）
# scope["url_route"]["kwargs"]：由 URLRouter 提取的路径参数（如 room_name）
application = ProtocolTypeRouter({
    # ProtocolTypeRouter是 Channels 的顶层路由器。它根据 ASGI scope['type']（例如 'http'、'websocket'）来决定使用哪个处理器。
    # 你这里只配置了 'websocket'，所以 WebSocket 连接会用你提供的处理链；HTTP 请求如果不配置会回退到默认（通常由 Django 的 ASGI 应用处理）。
    'websocket': AuthMiddlewareStack(
        # AuthMiddlewareStack 会帮你在 Consumer 里拿到 self.scope["user"]，可以判断当前 WebSocket 的用户身份。
        # 是一个把认证相关中间件（解析 cookies/session 并把用户信息放进 scope）打包好的中间件栈。
        # 作用：在 Consumer 中你可以通过 self.scope["user"] 或 scope["user"] 访问 Django 的 User 对象（或 AnonymousUser）。
        # 底层行为（可理解，不必死记）大致是：先解析 Cookie → 加载 session → 根据 session 恢复 user，然后把这些信息放到 scope 里传给下层。
        URLRouter(
            # URLRouter 会根据 URL 匹配到不同模块的 Consumer。根据 WebSocket 的路径（scope["path"]）把连接分发给对应的 Consumer。
            # Chat.routing.websocket_urlpatterns 和 PrivateChat.routing.websocket_urlpatterns 是两个列表（通常由 re_path / path 定义）
            # 这里用 + 合并成一个路由表。
            # 路由是按列表顺序匹配的，匹配到第一个符合的 pattern 就用对应的 Consumer。
            Chat.routing.websocket_urlpattern +
            PrivateChat.routing.websocket_urlpattern
        )
    ),
})